<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="../../react18/react.development.js"></script>
    <script src="../../react18/react-dom.development.js"></script>
    <script src="../../react18/babel.min.js"></script>
  </head>
  <body>
    <div id="app"></div>
    <button>点击添加数据</button>
    <script type="text/babel">
      // 创建一组数组数据
      const useData = ["小明", "小超", "小芳", "小孙"];

      const vDOM = (
        <ul>
          {useData.map((item) => {
            return <li>{item}</li>;
          })}
        </ul>
      );
      //   通过数组内的数据，循环并且创建相应的li元素
      const root = ReactDOM.createRoot(document.querySelector("#app"));
      root.render(vDOM);
      //   将虚拟DOM放在根容器内转为真实DOM，渲染在根容器内

      document.querySelector("button").onclick = function () {
        // 添加点击事件，更改原有数组

        // 尾部添加数据
        // useData.push("小杨");

        // 头部添加数据
        useData.unshift("小杨");

        /* 
            diff算法：
                在比较用diff算法比较时 原位置的节点不存在 则删除其子节点 重新渲染，不会按照子集去挨个比对
                节点位置发生变化，同阶层替换位置即可，若为跨层则是在现有位置创建 原有位置删除
        */

        /* 
            diff算法在同一层级的节点操作
            1.增：新加入的元素不爱原有集合， 则在现有位置添加，其他变动位置移动互换操作
            2.删：集合更新后没有了，需要删除该节点，其他位置节点互换移动
            3.移动：原有元素在集合内和其他元素调换位置 位置互换 不会删除重新创建
            4.更新：原有的元素属性发生改变，更换改变的属性
        */

        // 通过现有的数组再次创建虚拟DOM对象
        const vDOM = (
          <ul>
            {useData.map((item) => {
              return <li>{item}</li>;
            })}
          </ul>
        );
        // 将再次创建的DOM对象渲染在根容器上;
        root.render(vDOM);
      };
    </script>
  </body>
</html>
